package com.itheima.admin.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.itheima.admin.mapper.AdUserMapper;
import com.itheima.admin.pojo.AdUser;
import com.itheima.admin.service.AdUserService;
import com.itheima.common.exception.LeadNewsException;
import com.itheima.common.util.AppJwtUtil;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * @version 1.0
 * @description <p>管理员用户信息 业务实现</p>
 * @package com.itheima.admin.service.impl
 */
@Service
public class AdUserServiceImpl extends ServiceImpl<AdUserMapper, AdUser> implements AdUserService {

    /**
     * 登录验证
     *
     * @param paramMap
     * @return
     */
    @Override
    public Map<String, Object> loginCheck(Map<String, String> paramMap) {
        //1 提交用户名与密码
        //2 定义controller接收请求地址与参数
        //3 对参数做非空验证
        String name = paramMap.get("name");
        String password = paramMap.get("password");//这里是获得前端传过来的密码
        if (null == name || null == password) {
            //不能直接返回值,因为返回后Controller里面就只会出现成功,所以就直接报一个异常
            throw new LeadNewsException("用户名或密码错误");
        }

        //4 通过用户名查询用户表，得到用户信息
        AdUser loginUser = query().eq("name", name).one();
        //5 用户信息为空则代表用户名不存在，报错“用户名或密码错误”
        //5.1 不能只写用户名或密码错误，有可能让别人猜出密码
        if (null==loginUser){
            throw new LeadNewsException("用户名或密码错误");
        }
        //6 存在,就获取盐,加密数据库的密码
        String salt = loginUser.getSalt();
        String sqlPassword = loginUser.getPassword();//这里是从数据库获取的加密的密码

        //7 密码校验,把前端传过来的密码加盐再md5得到字符串
        String bytesPassword = DigestUtils.md5DigestAsHex((password+salt).getBytes());//把前端的密码加盐之后进行md5加密

        //8 加密后密码与数据库的密码比较
        if (!bytesPassword.equals(sqlPassword)){
            //9 不同,报错“用户名或密码错误”
            throw new LeadNewsException("用户名或密码错误");
        }

        //10 相同,则生成token
        String token = AppJwtUtil.createToken(loginUser.getId());
        //11 构建返回数据
        HashMap<String, Object> map = new HashMap<>();

        map.put("token",token);
        //11.1 不要在前端展示敏感数据,密码和盐
        loginUser.setPassword(null);
        loginUser.setSalt(null);

        map.put("user",loginUser);
        return map;
    }

    //public static void main(String[] args) {
    //    String salt ="123abc";
    //    System.out.println(DigestUtils.md5DigestAsHex(("admin"+salt).getBytes()));
    //}
}
